﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Entity;
using Business;
using System.Threading;

namespace CPEBookWeb
{
    public partial class Mur : System.Web.UI.Page
    {
        /// <summary>
        /// L'utilisateur loggé.
        /// </summary>
        private Utilisateur utilisateur;


        /// <summary>
        /// Appelée au chargement de la page.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Page_Load(object sender, EventArgs e)
        {
            // On vérifie qu'un utilisateur est loggé
            utilisateur = (Utilisateur)Session["Utilisateur"];
            if (utilisateur == null)
            {
                Response.Redirect("Default.aspx");
            }

            // On renseigne la page avec les données en session
            lienBarreProfil.NavigateUrl = "Profil.aspx?id=" + utilisateur.idutilisateur;
            lienConsulterProfil.Text = utilisateur.prenom + " " + utilisateur.nom;
            lienConsulterProfil.NavigateUrl = "Profil.aspx?id=" + utilisateur.idutilisateur;
            lienModifierProfil.NavigateUrl = "Editer.aspx";

            // On affiche les demandes d'amis
            rafraichirDemandes();

            // On affiche le fil d'actualité
            rafraichirActualites();
        }


        /// <summary>
        /// Methode permettant d'ajouter au panel du mur les statuts du mur
        /// </summary>
        private void rafraichirActualites()
        {
            // On récupère le panel destiné à accueillir les actualités
            Panel panel = (Panel)Page.FindControl("panelActualites");

            // On efface tout le contenu
            panel.Controls.Clear();

            // On récupère toutes les actualités à afficher
            List<Actualite> listActualites = ActualiteService.getActualitesDuMur(utilisateur.idutilisateur);

            if (listActualites != null)
            {
                // On boucle sur chaque actualité
                foreach (Actualite actualite in listActualites)
                {
                    // On appele le composant générateur de code
                    ActualiteView actualiteView = new ActualiteView
                    {
                        Actualite = actualite,
                        Utilisateur = utilisateur,
                        EcouteurJaime = new EventHandler(linkBtnJaime_Click),
                        EcouteurCommenter = new EventHandler(btnComment_Click),
                    };
                    Table tableActualite = actualiteView.getTableActualite();

                    // On ajoute la table
                    panel.Controls.Add(tableActualite);
                }
            }
        }


        /// <summary>
        /// Methode permettant d'ajouter au panel des amis les demandes d'amis.
        /// </summary>
        private void rafraichirDemandes()
        {
            // On récupère le panel destiné à accueillir les demandes d'amis
            Panel panel = (Panel)Page.FindControl("panelDemandes");

            // On efface tout le contenu
            panel.Controls.Clear();

            // On récupère toutes les demandes d'ajouts à afficher
            List<AmitieUtilisateur> listDemandes = AmisService.getDemandeAjout(utilisateur.idutilisateur);

            if (listDemandes != null)
            {
                // On appele le composant générateur de code
                DemandesAjoutView demandeAjoutView = new DemandesAjoutView
                {
                    Demandes = listDemandes,
                    EcouteurDecision = new EventHandler(btnAccepterOuIgnorer_Click)
                };
                Panel tableDemandes = demandeAjoutView.getTableDemandes();
                    
                // On ajoute la table
                panel.Controls.Add(tableDemandes);
            }
        }


        /// <summary>
        /// Evenement appelé au moment de l'envoi d'un commentaire
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void btnComment_Click(object sender, EventArgs e)
        {
            // On patiente pour afficher le "Patienter" au professeur.
            //Thread.Sleep(500);

            // On récupère le bouton à la source de l'évennement
            Button btnSource = (Button)sender;
            
            // On regarde qu'il s'agisse bien de la bonne commande
            if (btnSource.CommandName == "commenter")
            {
                // On récupère l'identifiant
                int idstatut = -1;
                if (Int32.TryParse(btnSource.CommandArgument, out idstatut))
                {
                    // On cherche le champs de texte associé à l'id
                    TextBox textBox = (TextBox)Page.FindControl("TextCommentStatut_" + idstatut.ToString());

                    // S'il est non vide on ajoute un commentaire
                    if (textBox != null && textBox.Text != "")
                        ActualiteService.ajouterCommentaire(idstatut, utilisateur.idutilisateur, textBox.Text, DateTime.Now);

                    // On met à jour le fil d'actu
                    rafraichirActualites();
                }
            }
        }


        /// <summary>
        /// Evenement appelé au moment d'un click sur un bouton j'aime
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void linkBtnJaime_Click(object sender, EventArgs e)
        {
            // On récupère le lien à la source de l'évennement
            LinkButton lienSource = (LinkButton)sender;

            // On regarde qu'il s'agisse bien de la bonne commande
            if (lienSource.CommandName == "aimer")
            {
                // On récupère l'identifiant
                int idstatut = -1;
                if (Int32.TryParse(lienSource.CommandArgument, out idstatut))
                {
                    // On prends en compte le "J'aime"
                    ActualiteService.aimer(idstatut, utilisateur.idutilisateur);

                    // On met à jour le fil d'actu
                    rafraichirActualites();
                }
            }
        }


        /// <summary>
        /// Evenement appelé au moment de l'ajout d'un nouveau statut
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnAjoutStatut_Click(object sender, EventArgs e)
        {
            // On ajoute pas si null ou vide
			if (txtStatut != null && txtStatut.Text != "") {

                // On ajoute l'actualité
				ActualiteService.ajouterActualite(utilisateur.idutilisateur, txtStatut.Text, DateTime.Now);

                // On met à jour le fil d'actu
                rafraichirActualites();
			}

            // Dans tous les cas on réinitialise le champs
            txtStatut.Text = "";
        }


        /// <summary>
        /// Evenement appelé lors d'un clic sur "Ajouter" ou "Accepter".
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnAccepterOuIgnorer_Click(object sender, EventArgs e)
        {
            // On récupère le bouton à la source de l'évennement
            Button btnSource = (Button)sender;

            // On vérifie que la commande est valide
            if (btnSource.CommandName == "accepter" || btnSource.CommandName == "ignorer")
            {
                // On récupère l'identifiant
                int iddemandeur = -1;
                if (Int32.TryParse(btnSource.CommandArgument, out iddemandeur))
                {
                    // On traite en fonction de la réponse
                    if (btnSource.CommandName == "accepter")
                    {
                        AmisService.confirmerDemande(iddemandeur, utilisateur.idutilisateur);

                        // Après ajout on va sur la page du demandeur
                        Response.Redirect("Profil.aspx?id=" + iddemandeur.ToString());
                    }
                    else
                    {
                        AmisService.ignorerDemande(iddemandeur, utilisateur.idutilisateur);
                    }

                    // On met à jour la liste des demandes
                    rafraichirDemandes();
                }
            }
        }


        /// <summary>
        /// Evenement appelé lors d'un clic sur "Rechercher".
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void rechercheBouton_Click(object sender, EventArgs e)
        {
            Response.Redirect("Recherche.aspx?r=" + rechercheInput.Text);
        }

    }
}